package utils

import (
	"fmt"
	"regexp"
)

// Validator 定义验证器接口
type Validator interface {
	Validate(value string) bool
}

// PhoneValidator 手机号验证器结构体
type PhoneValidator struct {
	pattern *regexp.Regexp
}

// Validate 实现验证方法
func (p *PhoneValidator) Validate(value string) bool {
	return p.pattern.MatchString(value)
}

// ValidatorType 验证器类型枚举
type ValidatorType int

const (
	ChinaMobile  ValidatorType = iota // 中国移动
	ChinaUnicom                       // 中国联通
	ChinaTelecom                      // 中国电信
)

// ValidatorFactory 验证器工厂
type ValidatorFactory struct{}

// CreateValidator 根据类型创建验证器
func (f *ValidatorFactory) CreateValidator(t ValidatorType) (Validator, error) {
	var pattern string

	switch t {
	case ChinaMobile:
		// 中国移动号码段正则
		pattern = `^1(34[0-8]|3[5-9]\d|47|5[0-27-9]\d|65|7[28]|8[2-478]|9[578])\d{7}$`
	case ChinaUnicom:
		// 中国联通号码段正则
		pattern = `^1(3[0-2]|45|5[56]|66|7[156]|8[56])\d{7}$`
	case ChinaTelecom:
		// 中国电信号码段正则
		pattern = `^1(33|49|53|7[37]|8[019]|9[0139])\d{7}$`
	default:
		return nil, fmt.Errorf("不支持的验证器类型: %d", t)
	}

	reg, err := regexp.Compile(pattern)
	if err != nil {
		return nil, fmt.Errorf("正则表达式编译失败: %v", err)
	}

	return &PhoneValidator{pattern: reg}, nil
}

func ValidateMobile(mobile string) bool {
	factory := ValidatorFactory{}

	// 创建中国移动号码验证器
	mobileValidator, err := factory.CreateValidator(ChinaMobile)
	if err != nil {
		fmt.Println("创建验证器失败:", err)
		return false
	}
	validate := mobileValidator.Validate(mobile)
	if validate != true {
		return true
	}
	return false
}
